/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import java.awt.Color;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.List;
import java.util.TooManyListenersException;
import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;
import javax.swing.JOptionPane;
import modelo.ContenedorComponente;
import vista.panel.InterfazInicio;

/**
 *
 * @author Elias Mendoza
 */
public class PuertoSerial {

    ContenedorComponente cc;
    InterfazInicio p;
    public PuertoSerial() {
    }
    public PuertoSerial(InterfazInicio p){
      this.p = p;
    }

    public void conectarPuerto(ContenedorComponente cc,List listUltReg) {
        this.cc = cc;
        CommPortIdentifier puertoSerial = compruebaDisponibilidad(cc.getPuerto());
        if (puertoSerial != null) {
            cc.getConectar().setEnabled(false);
            cc.getLabelPuerto().setForeground(Color.BLUE);
            cc.getLabelPuerto().setText(cc.getPuerto());
            cc.getLabelEstadoPuerto().setForeground(Color.BLUE);
            cc.getLabelEstadoPuerto().setText("Conectado");
            JOptionPane.showMessageDialog(null, "Conexión Establecida con PuertoSerial(" + cc.getPuerto() + ")", "Conexión a Puerto Serie", JOptionPane.INFORMATION_MESSAGE);
            ProcesaCadena pc = new ProcesaCadena(p);
            iniciaLectura(puertoSerial, pc);

        } else {
            JOptionPane.showMessageDialog(null, " Ha Fallado la Conexión a PuertoSerial(" + cc.getPuerto() + ")", "Conexión a Puerto Serie", JOptionPane.ERROR_MESSAGE);
        }
    }
    //nuevo
     public void conectarPuerto() {
       String puerto;
       if(p.jCheckBoxPuerto.isSelected())
         puerto = p.jTextFieldPuertoPerzonalisado.getText();
       else
         puerto = p.jComboBoxPuertoSerial.getSelectedItem().toString();
       
        CommPortIdentifier puertoSerial = compruebaDisponibilidad(puerto);
        if (puertoSerial != null) {
          p.jButtonConectarPuerto.setEnabled(false);
          p.jLabelPuertoSerie.setForeground(Color.BLUE);
          p.jLabelPuertoSerie.setText(puerto);
          p.jLabelEstadoPuerto.setForeground(Color.blue);
          p.jLabelEstadoPuerto.setText("Conectado");      
            JOptionPane.showMessageDialog(null, "Conexión Establecida con PuertoSerial(" + puerto + ")", "Conexión a Puerto Serie", JOptionPane.INFORMATION_MESSAGE);
            ProcesaCadena pc = new ProcesaCadena(p);
            iniciaLectura(puertoSerial, pc);

        } else {
            JOptionPane.showMessageDialog(null, " Ha Fallado la Conexión a PuertoSerial(" + puerto + ")", "Conexión a Puerto Serie", JOptionPane.ERROR_MESSAGE);
        }
    }

//  public CommPortIdentifier compruebaDisponibilidad(String puerto) {
//    CommPortIdentifier idPuerto;
//    Enumeration listaPuertos;
//    listaPuertos = CommPortIdentifier.getPortIdentifiers();
//    while (listaPuertos.hasMoreElements()) {
//      idPuerto = (CommPortIdentifier) listaPuertos.nextElement();
//      if (idPuerto.getPortType() == CommPortIdentifier.PORT_SERIAL) {
//        if (idPuerto.getName().equals(puerto)) {
//          System.out.println("El puerto " + puerto + " esta disponible");
//          return idPuerto;
//        }
//      }
//    }
//    System.out.println("no se encontro el puerto " + puerto);
//    return null;
//  }
  //nuevo
   public CommPortIdentifier compruebaDisponibilidad(String puerto) {
    CommPortIdentifier idPuerto;
    Enumeration listaPuertos;
    listaPuertos = CommPortIdentifier.getPortIdentifiers();
    while (listaPuertos.hasMoreElements()) {
      idPuerto = (CommPortIdentifier) listaPuertos.nextElement();
      if (idPuerto.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        if (idPuerto.getName().equals(puerto)) {
          System.out.println("El puerto " + puerto + " esta disponible");
          return idPuerto;
        }
      }
    }
    System.out.println("no se encontro el puerto " + puerto);
    return null;
  }

  public void iniciaLectura(CommPortIdentifier puerto, ProcesaCadena pc) {
    HiloEventoPuerto obj = new HiloEventoPuerto(puerto, pc);
  }
}



class HiloEventoPuerto  implements Runnable, SerialPortEventListener {

  CommPortIdentifier idPuerto;
  InputStream entrada;
  SerialPort puertoSerie;
  ProcesaCadena pc;
  Thread lectura;

  
  HiloEventoPuerto(CommPortIdentifier x, ProcesaCadena pc) {
    this.idPuerto = x;
    this.pc = pc;
    configuracionPuerto();
    lectura = new Thread(this);
    lectura.start();
  }

  public void configuracionPuerto() {

    try {
      puertoSerie = (SerialPort) idPuerto.open("AplLectura", 2000);
    } catch (PortInUseException e) {
    }
    try {
      entrada = puertoSerie.getInputStream();
    } catch (IOException e) {
    }
    // Añadimos un receptor de eventos para estar informados de lo que suceda en el puerto
    try {
      puertoSerie.addEventListener(this);
    } catch (TooManyListenersException e) {
    }
    // Hacemos que se nos notifique cuando haya datos disponibles en el buffer de la puerta
    puertoSerie.notifyOnDataAvailable(true);
    // Se fijan los parámetros de comunicación del puerto
    try {
      puertoSerie.setSerialPortParams(9600,
              SerialPort.DATABITS_8,
              SerialPort.STOPBITS_1,
              SerialPort.PARITY_NONE);
    } catch (UnsupportedCommOperationException e) {
    }
  }

  @Override
  public void run() {
    try {
      Thread.sleep(3000);
    } catch (InterruptedException e) {
    }

  }

  @Override
  public void serialEvent(SerialPortEvent ev) {
    switch (ev.getEventType()) {

      case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
        break;
      case SerialPortEvent.DATA_AVAILABLE:
        try {
          while (entrada.available() > 0) {
            char caracter = (char) entrada.read();
            pc.recibeLectura("" + caracter);
          }
        } catch (IOException e) {
          System.out.println(e);
        }
        break;
    }
  }
}
